#ifndef EPSILON_GREEDY_ALLOCATION_H
#define EPSILON_GREEDY_ALLOCATION_H

#include "ns3/object.h"
#include "channel-allocation.h"
#include <random>

namespace ns3 {

/**
 * \ingroup sagin
 * \brief Epsilon-Greedy信道分配算法 - 专为深度学习数据收集设计
 * 
 * 以一定概率(epsilon)随机探索，以(1-epsilon)概率选择最优信道。
 * 此策略能平衡探索与利用，适合为深度学习模型收集训练数据。
 */
class EpsilonGreedyAllocation : public ChannelAllocation
{
public:
    /**
     * \brief Get the TypeId
     * \return The TypeId
     */
    static TypeId GetTypeId();
    
    EpsilonGreedyAllocation();
    virtual ~EpsilonGreedyAllocation();
    
    /**
     * 设置epsilon值(探索概率)
     * \param epsilon 探索概率[0,1]，默认0.3
     */
    void SetEpsilon(double epsilon);
    
    /**
     * 获取当前epsilon值
     * \return 当前epsilon值
     */
    double GetEpsilon() const;
    
    // 实现纯虚函数
    virtual void LogAllocationResults() override;
    
protected:
    /**
     * 实现Epsilon-Greedy信道分配算法
     * \return 节点到信道的映射
     */
    virtual std::map<uint32_t, int> AllocateChannels() override;
    
private:
    double m_epsilon;
    double m_throughputWeight;
    double m_delayWeight;
    uint32_t m_iteration; // 记录迭代次数以产生不同的随机数序列
    
    // 计算性能指标函数，用于评估信道分配的效果
    double CalculatePerformanceMetric(uint32_t nodeId, int channelId);
    
    // 用于探索阶段的随机信道选择
    int ExploreRandomChannel(uint32_t nodeId, const std::vector<int>& availableChannels);
};

} // namespace ns3

#endif /* EPSILON_GREEDY_ALLOCATION_H */
